Derleyici yönergeleri
Bunlar, #
ile başlayan ve derleyiciye bazı eylemleri, kontrolleri gerçekleştirmesi veya parametreleri değiştirmesi talimatı veren anahtar kelimelerdir.
Bu yönergeler yalnızca en dış katmanda (herhangi bir işlev tanımının içinde değil) kullanılabilir.
#include
#include
yönergesi, dahil edilen yerde başka bir FunC kaynak kodu dosyasını dahil etmeye olanak tanır.
Sözdizimi:
#include "filename.fc";
Dikkat: Dosyalar tekrar dahil edilme için otomatik olarak kontrol edilir ve bir dosyanın birden fazla kez dahil edilme girişimleri varsayılan olarak yok sayılır; 2'den düşük bir ayrıntı seviyesi varsa uyarı verilmez.
Bir dahil edilen dosyanın işlenmesi sırasında bir hata oluşursa, ayrıca dahil edilen dosyaların her birinin yerlerini içeren bir dahil etme yığın dizisi yazdırılır.
#pragma
#pragma
yönergesi, derleyiciye dilin kendisinin sunduğundan daha fazla bilgi sağlamak için kullanılır.
#pragma version
Sürüm pragma'sı, dosyayı derlerken belirli bir FunC derleyici sürümünü zorlamak için kullanılır.
Sürüm formatı:
formatında belirtilir; burada _a ana sürüm, b küçük sürüm ve c yaman sürümdür._
Geliştiricinin kullanabileceği birkaç karşılaştırma operatörü vardır:
- a.b.c veya =a.b.c—tam olarak a.b.c sürümündeki derleyiciyi gerektirir
- >a.b.c—derleyici sürümünün a.b.c'den büyük olmasını gerektirir
- >=a.b.c—derleyici sürümünün a.b.c'ye büyük veya eşit olmasını gerektirir
- _, >=, \a.b aynı zamanda >a.b.0 ile aynı anlamdadır (bu nedenle _a.b.0 sürümünü EŞLEŞTİRMEZ)
- \<=a aynı zamanda \<=a.0.0 ile aynı anlamdadır (bu nedenle a.0.1 sürümünü EŞLEŞTİRMEZ)
- ^a.b.0 EŞİT DEĞİLDİR ^a.b ile
Örnek: ^a.1.2 a.1.3 ile eşleşir fakat a.2.3 veya a.1.0 ile eşleşmez; ancak ^a.1 hepsi ile eşleşir.
Bu yönerge birden fazla kez kullanılabilir; derleyici sürümü sağlanan tüm koşulları karşılamalıdır.
#pragma not-version
Bu pragma'nın sözdizimi sürüm pragma ile aynıdır ancak koşul karşılandığında başarısız olur.
Kullanım örneği: Belirli bir sürümü kara listeye almak için kullanılabilir.
#pragma allow-post-modification
funC v0.4.1
Varsayılan olarak, bir değişkeni aynı ifadede değiştirmeden önce kullanmak yasaktır. Diğer bir deyişle,
(x, y) = (ds, ds~load_uint(8))
derlenmeyecek, ancak
(x, y) = (ds~load_uint(8), ds)
geçerlidir.
Bu kural, kütük atamaları ve işlev çağrısında kullanılmak üzere değişkeni kullanımdan sonra değiştirmeye izin veren #pragma allow-post-modification
ile geçersiz kılınabilir; genelde alt ifadeler soldan sağa doğru hesaplanır:
(x, y) = (ds, ds~load_bits(8))
ifadesinde x
, başlangıçta ds
içerir; f(ds, ds~load_bits(8))
işlevinin ilk argümanı f
'nin başlangıçta ds
içerecektir ve ikincisi - ds
nin 8 bitidir.
Dikkat: #pragma allow-post-modification
yalnızca pragma'dan sonraki kodlar için geçerlidir.
#pragma compute-asm-ltr
funC v0.4.1
Asm bildirimleri argümanların sırasını değiştirebilir, örneğin aşağıdaki ifadede
idict_set_ref(ds~load_dict(), ds~load_uint(8), ds~load_uint(256), ds~load_ref())
Ayrıntılanma sırası: load_ref()
, load_uint(256)
, load_dict()
ve load_uint(8)
aşağıdaki asm bildirimine göre olacaktır (not: asm(value index dict key_len)
):
cell idict_set_ref(cell dict, int key_len, int index, cell value) asm(value index dict key_len) "DICTISETREF";
Bu davranış, #pragma compute-asm-ltr
ile katı soldan sağa hesaplama sırasına değiştirilebilir.
Sonuç:
#pragma compute-asm-ltr
...
idict_set_ref(ds~load_dict(), ds~load_uint(8), ds~load_uint(256), ds~load_ref());
ayrıntılama sırası load_dict()
, load_uint(8)
, load_uint(256)
, load_ref()
olacak ve tüm asm permütasyonları hesaplamadan sonra gerçekleşecektir.
Dikkat: #pragma compute-asm-ltr
yalnızca pragma'dan sonraki kodlar için geçerlidir.